<?php

namespace app\aliyun\controller;

use Rds\Request\V20140815\CreateReadOnlyDBInstanceRequest;

class AliyunClient
{
    /**
     * 私有属性，用于保存实例
     * @var
     */
    private static $instance;

    /**
     * ali ID
     * @var string
     */
    private $acceeId = 'LTAI5t7S3vxVTREhsk2RAi6z';

    /**
     * ali KEY
     * @var string
     */
    private $acceeKey = 'Qi8WCCKYpabSnr1ZOZBHQREguf8ieP';

    /**
     * regionId
     */
    private $regionId = 'cn-beijing';

    /**
     * 构造方法私有化，防止外部创建实例
     * Aliyun constructor.
     */
    private function __construct()
    {
        include_once EXTEND_PATH . 'aliyun-openapi-php-sdk/aliyun-php-sdk-core/Config.php';
    }


    /**
     * 公有方法，用于获取实例
     * @return AliyunClient
     */
    public static function getInstance()
    {
        //判断实例有无创建，没有的话创建实例并返回，有的话直接返回
        if (!(self::$instance instanceof self))
        {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * 获取ali client
     * @return \DefaultAcsClient
     */
    public function getClient()
    {
        $iClientProfile = \DefaultProfile::getProfile($this->regionId, $this->acceeId, $this->acceeKey);
        \DefaultProfile::addEndpoint($this->regionId, $this->regionId, 'Green', 'green.cn-beijing.aliyuncs.com');
        return new \DefaultAcsClient($iClientProfile);
    }

    //克隆方法私有化，防止复制实例
    private function __clone()
    {
        trigger_error('Clone is not allow!', E_USER_ERROR);
    }

    /**
     * 创建只读数据库
     */
    public function createReadOnlyRds()
    {
        # 创建DefaultAcsClient实例并初始化
        $clientProfile = \DefaultProfile::getProfile(
            'cn-beijing',                   # 您的 Region ID
            'LTAIwhBV7r34tFaf',               # 您的 AccessKey ID
            'm6QCvFdo4QUct1JiNQPCprDJdEwI7F'            # 您的 AccessKey Secret
        );
        $client = new \DefaultAcsClient($clientProfile);

        //****查询城市和可用区****
//        $request = new DescribeRegionsRequest();
//        $response = $client->getAcsResponse($request);
//        var_dump($response);
        //****查询城市和可用区****

        # 创建只读实例 （接口文档 ：https://help.aliyun.com/document_detail/26252.html?spm=a2c4g.11186623.6.862.78df7858ApEbk6）
        $request = new CreateReadOnlyDBInstanceRequest();
        //数据中心，长度不超过50个字符。通过函数DescribeRegions查看可用的数据中心。
        $request->setRegionId("cn-beijing");
        //可用区id，通过函数DescribeRegions查看可用的可用区。
        $request->setZoneId("cn-beijing-a");
        //主实例ID
        $request->setDBInstanceId("rm-2ze2bmj4s03q18g84");
        //设置 只读实例的规格 (https://help.aliyun.com/document_detail/26312.html?spm=a2c4g.11186623.2.13.14f77208D3sJ9c#reference_lbw_tyw_5db)
//        $request->setDBInstanceClass("rds.mysql.st.h43");//60核 470GB
//        $request->setDBInstanceClass("rds.mysql.st.d13");//30核 220GB
        $request->setDBInstanceClass("rds.mysql.c1.xlarge");//独享型 mysqlro.x4.4xlarge.1

        //自定义存储空间，取值范围：[5,1000]，每5G进行递增，单位：GB。
        $request->setDBInstanceStorage(200);
        //？数据库版本号，仅支持输入值：5.6。
        $request->setEngineVersion(5.7);
        //Postpaid：按量付费； Prepaid：包年包月。
        $request->setPayType("Postpaid");

        //实例的描述或备注信息，不超过256个字节&不能以或https://开头，以中文、英文字母开头。可以包含中文、英文字符、“_”、“-”，数字，长度为2~256个字符
        $request->setDBInstanceDescription("created by api");

        # 发起请求并处理返回
        try
        {
            $response = $client->getAcsResponse($request);
            print_r($response, null);
        }
        catch (\ServerException $e)
        {
            print "Error: " . $e->getErrorCode() . " Message: " . $e->getMessage() . "\n";
        }
        catch (\ClientException $e)
        {
            print "Error: " . $e->getErrorCode() . " Message: " . $e->getMessage() . "\n";
        }

    }
}
